جزوه · چالش ششم فصل چهارم · پیدا کردن Inodeهای یکسان ← بازگشت به فهرست
📘 چالش ششم فصل چهارم پیدا کردن Inodeهای یکسان
📅 تاریخ: چهارشنبه، ۲۸ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی)
🔍 قبل از شروع، یه مثال ساده:

فرض کن دو تا اسم متفاوت داری که به یه خونه اشاره می‌کنن. مثلاً «خونه مادربزرگ» و «ویلای شمال» هر دو به یه آدرس واحد اشاره دارن. توی لینوکس، این رو با Hard Link انجام می‌دی. هر دو اسم به یه Inode اشاره می‌کنن. این چالش بهت یاد میده چطور همه اسم‌هایی که به یه Inode اشاره می‌کنن رو پیدا کنی!

▍ مقدمه

در این چالش، با مفهوم Hard Link و نحوه پیدا کردن فایل‌هایی با Inode یکسان آشنا می‌شوید. زمانی که یک Hard Link ایجاد می‌کنید، در واقع یک نام جدید به یک Inode اضافه می‌کنید. با استفاده از دستور find -inum می‌توانید همه فایل‌هایی که به یک Inode اشاره می‌کنند را پیدا کنید.

📌 نکته کلیدی:

Hard Link یک نام جدید برای یک فایل موجود است که همان Inode را به اشتراک می‌گذارد. بنابراین، تغییر در محتوای فایل از طریق هر یک از نام‌ها، روی همه نام‌ها تأثیر می‌گذارد.

دستور find -inum فایل‌هایی را که Inode مشخصی دارند، جستجو می‌کند.

▍ بررسی چالش از روی تصویر

• مرحله ۱: ایجاد فایل اصلی و Hard Link

┌──(ya3in㉿kali)-[~/test] └─$ touch mabedini └─$ ln mabedini work3/m

توضیح: touch mabedini یک فایل خالی به نام mabedini می‌سازد. ln mabedini work3/m یک Hard Link به نام m در دایرکتوری work3 ایجاد می‌کند که به همان Inode اشاره دارد.

• مرحله ۲: بررسی Inode با stat

خروجی دستور stat mabedini:

File: mabedini Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 806h/2054d Inode: 11303070 Links: 3 Access: (0664/-rw-rw-r--) Uid: ( 1000/ abedini) Gid: ( 1000/ abedini) Access: 2024-05-11 18:12:38.953882058 +0330 Modify: 2024-05-11 18:12:38.953882058 +0330 Change: 2024-05-11 18:15:08.199012300 +0330 Birth: 2024-05-11 18:12:38.953882058 +0330

توضیح: stat mabedini نشان می‌دهد که:

خروجی دستور stat work3/m:

File: work3/m Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 806h/2054d Inode: 11303070 Links: 3 Access: (0664/-rw-rw-r--) Uid: ( 1000/ abedini) Gid: ( 1000/ abedini) Access: 2024-05-11 18:12:38.953882058 +0330 Modify: 2024-05-11 18:12:38.953882058 +0330 Change: 2024-05-11 18:15:08.199012300 +0330 Birth: 2024-05-11 18:12:38.953882058 +0330

توضیح: stat work3/m نیز همان Inode (11303070) را نشان می‌دهد. یعنی هر دو فایل به یک Inode اشاره می‌کنند.

• مرحله ۳: پیدا کردن همه فایل‌های با Inode یکسان

┌──(ya3in㉿kali)-[~/test] └─$ find * -inum 11303070 abedini/mohammad mabedini work3/m

توضیح: find * -inum 11303070 همه فایل‌هایی را که Inode برابر با 11303070 دارند، پیدا می‌کند. خروجی نشان می‌دهد که سه فایل به این Inode اشاره می‌کنند:

💡 نکته:

find * به این معنی است که در همه فایل‌ها و دایرکتوری‌های مسیر جاری جستجو کن. اگر می‌خواهید کل سیستم را جستجو کنید، از find / -inum 11303070 استفاده کنید (نیاز به دسترسی root دارد).

▍ چرا تعداد لینک‌ها ۳ است؟

در خروجی stat، Links: 3 نشان می‌دهد که سه نام به این Inode اشاره می‌کنند. این سه نام عبارتند از:

هر بار که یک Hard Link جدید ایجاد می‌کنید، تعداد لینک‌ها یک واحد افزایش می‌یابد.

📝 مثال دیگر:

اگر یک فایل به نام file1.txt بسازید و دو Hard Link به نام‌های file2.txt و file3.txt ایجاد کنید، تعداد لینک‌ها ۳ خواهد بود.

┌──(ya3in㉿kali)-[~] └─$ touch file1.txt └─$ ln file1.txt file2.txt └─$ ln file1.txt file3.txt └─$ stat file1.txt | grep Links Links: 3
🧪 چالش شما:

یک فایل به نام myfile بسازید. سپس دو Hard Link به نام‌های link1 و link2 برای آن ایجاد کنید. با stat تعداد لینک‌ها را بررسی کنید و با find -inum همه فایل‌های با Inode یکسان را پیدا کنید.

touch myfile
ln myfile link1
ln myfile link2
stat myfile | grep Links
find * -inum $(stat -c %i myfile)
✅ پاسخ چالش:
┌──(ya3in㉿kali)-[~] └─$ touch myfile └─$ ln myfile link1 └─$ ln myfile link2 └─$ stat myfile | grep Links Links: 3 └─$ find * -inum $(stat -c %i myfile) link1 link2 myfile

توضیح: stat -c %i myfile فقط Inode فایل myfile را نمایش می‌دهد و find * -inum همه فایل‌های با آن Inode را پیدا می‌کند.

📌 جمع‌بندی:
  • Hard Link: یک نام جدید برای یک فایل موجود که همان Inode را به اشتراک می‌گذارد.
  • تعداد لینک‌ها (Links): تعداد نام‌هایی که به یک Inode اشاره می‌کنند.
  • دستور find -inum: برای پیدا کردن همه فایل‌های با Inode مشخص.
  • دستور stat -c %i: برای نمایش Inode یک فایل.
  • هر Hard Link جدید، تعداد لینک‌ها را یک واحد افزایش می‌دهد.